/*
 * @Author: weiting112 10254483+weiting112@user.noreply.gitee.com
 * @Date: 2022-08-16 09:08:05
 * @LastEditors: weiting112 10254483+weiting112@user.noreply.gitee.com
 * @LastEditTime: 2022-08-17 10:46:17
 * @FilePath: \数组api重构\1-作业.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

// pop
var arr = [1,2,3,4]
Array.prototype.mypop = function () {
    if(this.length>0){
        let last = this[this.length-1] //数组的最后一项
        this.length--;
        return last
    }else{
        return undefined
    }
}
var res = arr.mypop();
console.log(res,arr);

// // push
// // 参数：任何想要添加的数据类型 返回值：新数组的长度 修改原数组
var arr = [1,2,3,4]
Array.prototype.myPush = function () {
    for(let i=0;i<arguments.length;i++){
        this[this.length]=arguments[i]
    }
    return this.length
}
var res = arr.myPush('hello',14)
console.log(res,arr);

// shift
// 无参数 返回值：删除掉的数组 修改原数组
var arr = [1,2,3,4]
Array.prototype.myshift=function(){
    let first = this[0]
    for (let index = 0; index < this.length; index++) {
        this[index]=this[index+1]
    }
    this.length--;
    return first
}
var res = arr.myshift()
console.log(res,arr);

// unshift
// 参数：任何想要添加的数组元素 返回值：新的数组长度 修改原数组
var arr = [1,2,3,4]
Array.prototype.myUnshift=function(){
    let sum = this.length + arguments.length
    for (let index = sum; index > 0; index--) {
            // 将原数组的元素向后移动arguments
            if(index>arguments.length){
                this[index-1]=this[index-1-arguments.length]
            }else {
                this[index-1]=arguments[index-1]
            }
    }
    
}
var res = arr.unshift('hello',12,34)
console.log(res,arr);

// 五个迭代方法
// // every
// // 参数：函数  返回值是true或false 原数组不改变
var arr  = [5,2,3,4]
Array.prototype.myEvery = function(fun,obj) {
    // 判断是否满足条件 只要有一项不满足就返回false
    for (let i = 0; i < this.length; i++) {
        if(!(obj?fun.call(obj,this[i],i,this):fun(this[i],i,this))){
            return false
        }  
    }
  return true
}
var res = arr.myEvery(function (item,index,arr) {
    return item>1
},{name:'zhangsan'})
console.log(res,arr);

// some
// 只要有一个满足条件就返回true
var arr = [1,2,3,4]
Array.prototype.mySome = function(fun,obj) {
    for (let i = 0; i < arr.length; i++) {
        if(obj?fun.call(obj,[this[i],i,this]):fun(this[i],i,this)){
            return true
        }
    }
    return false
}
var res = arr.mySome(function(item,index,arr){
    console.log(this);
    return item>1
},{name:'zhangsan'})


// map 映射对每一个数组元素做操作
// 参数：函数（item，index，arr） 返回值：操作后的数组
var arr = [1,2,3,4];
Array.prototype.Mymap= function (fun,obj) {
    let newArr = [];
    for (let i = 0; i < this.length; i++) {
        newArr.push(fun(this[i]));   
    }
    return newArr;
}
var res = arr.Mymap(function (item,index,arr) {
    return item+1
})
console.log(res);

// filter 过滤符合条件的数组元素组成新的数组
// 返回：新数组 参数：函数 原数组不改变
var arr = [1,2,3,4]
Array.prototype.Myfilter = function (fun,obj) {
    let newArr = []
   for (let i = 0; i < this.length; i++) {
    if(obj?fun.call(obj,this[i]):fun(this[i])){
        newArr.push(this[i])
    }
   }
    return newArr
}
var res = arr.Myfilter(function(item,index,arr) {
    console.log(this);
    return item>2
},{name:'zhangsan'})
console.log(res,arr);

// forEach 遍历数组
var arr = [1,2,3,4]
Array.prototype.myForEach = function(fun,obj) {
    for(let i=0;i<this.length;i++){
        obj?fun.call(obj,this[i]):fun(this[i])
    }
}
var res = arr.forEach(function (item,index,arr) {
    console.log(item);
},{name:'zhangsan'})
console.log(arr);